# NOTE (DS, 02/09/2018): mean plots were incorrect; using new function
require(data.table)
require(phyloseq)
require(ggplot2)
require(plotly)
require(DT)
require(shiny)
# source("source/functions_v2.R")
source("source/functions_may2019.R")
Load data
# Counts
load("data/ps.RData")
# Taxonomy
load("data/taxa.plus.RData")
taxa <- data.table(seq16s = rownames(taxa.plus),
taxa.plus)
# Samples
# ps@sam_data
load("data/samples.RData")
samples$Sample <- substr(x = samples$Name,
start = 1,
stop = 5)
samples$Sample[samples$Sample %in% c("4A_S1",
"4B_S2",
"4C_S3")] <-
substr(x = samples$Sample[samples$Sample %in% c("4A_S1",
"4B_S2",
"4C_S3")],
start = 1,
stop = 2)
DT::datatable(samples)
Taxonomy Ranks:
King Phillip Can nOt Find Green Socks
- Kingdom
- Phylum
- Class
- Order
- Family
- Genus
- Species
Richness
# Part I: keep controls and PEITCs at weeks 5 and 9 only
w59 <- prune_samples(samples = sample_names(ps)[!(sample_names(ps) %in%
c("4A",
"4B",
"4C",
"Undetermined"))],
x = ps)
# w59 <- prune_samples(samples = sample_names(ps)[sample_names(ps) != "Undetermined"],
# x = ps)
# p1 <- plot_richness(w59,
# x = "Diet_Week",
# measures = "Shannon",
# color = "Week") +
# geom_line(aes(group = ID),
# color = "black") +
# geom_point(shape = 21,
# size = 3,
# color = "black")
p1 <- plot_richness(w59,
x = "Diet_Week",
measures = "Shannon") +
geom_line(aes(group = ID),
color = "black") +
geom_point(aes(fill = ID),
shape = 21,
size = 3,
color = "black") +
scale_x_discrete("") +
theme(axis.text.x = element_text(angle = 30,
hjust = 1,
vjust = 1),
legend.position = "none")
ggplotly(p1)
tiff(filename = "tmp/ko_shannon.tiff",
height = 4,
width = 5,
units = "in",
res = 600,
compression = "lzw+p")
print(p1)
graphics.off()
OTU table (first 10 rows)
Total counts per sample (i.e. sequencing depth)
Relative abundance (%) at Phylum level
Remove phyla with relative abundance of >= 1% in less than 10% of samples.
t1 <- data.table(Phylum = ra_p$Phylum,
`Number of Samples` = rowSums(ra_p[, 2:ncol(ra_p)] >= 0.01))
t1$`Percent Samples` <- t1$`Number of Samples`/30
setorder(t1, -`Number of Samples`)
datatable(t1,
rownames = FALSE,
caption = "Taxonomic count table",
class = "cell-border stripe",
options = list(search = FALSE,
pageLength = nrow(t1))) %>%
formatPercentage(columns = 3,
digits = 1)
[1] "Bacteroidetes, Firmicutes, Proteobacteria, Actinobacteria, Saccharibacteria, Deferribacteres, Cyanobacteria"
Relative Abundance in Samples at Different Taxonomic Ranks
1. Class
p0 <- ggplot(mu,
aes(x = Week,
y = x,
group = Treatment)) +
facet_wrap(~ Class,
scale = "free_y") +
geom_line() +
geom_point(aes(shape = Treatment,
color = Treatment),
size = 3,
alpha = 0.5) +
scale_x_discrete("") +
scale_y_continuous("Relative Abundance (%)") +
theme(legend.position = "top",
axis.text.x = element_text(angle = 45,
hjust = 1))
tiff(filename = "tmp/ko_class_over_time.tiff",
height = 5,
width = 7,
units = "in",
res = 600,
compression = "lzw+p")
print(p0)
graphics.off()
print(p0)

p1 <- ggplot(mu,
aes(x = x,
y = Class,
color = Treatment,
shape = Week)) +
geom_point(size = 3,
alpha = 0.5) +
geom_vline(xintercept = 1,
linetype = "dashed") +
scale_x_continuous("Relative Abundance (%)") +
theme(legend.position = "top")
tiff(filename = "tmp/ko_class_ra.tiff",
height = 4,
width = 7,
units = "in",
res = 600,
compression = "lzw+p")
print(p1)
graphics.off()
ggplotly(p1)
LS0tCnRpdGxlOiAiTnJmMiBLTyAoLS8tKSBQRUlUQyAxNlMgTWljcm9iaW9tZSBEYXRhIFZpc3VhbGl6YXRpb24iCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCgpgYGB7ciBzZXR1cH0KIyBOT1RFIChEUywgMDIvMDkvMjAxOCk6IG1lYW4gcGxvdHMgd2VyZSBpbmNvcnJlY3Q7IHVzaW5nIG5ldyBmdW5jdGlvbgpyZXF1aXJlKGRhdGEudGFibGUpCnJlcXVpcmUocGh5bG9zZXEpCnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZShwbG90bHkpCnJlcXVpcmUoRFQpCnJlcXVpcmUoc2hpbnkpCgojIHNvdXJjZSgic291cmNlL2Z1bmN0aW9uc192Mi5SIikKc291cmNlKCJzb3VyY2UvZnVuY3Rpb25zX21heTIwMTkuUiIpCmBgYAoKIyBMb2FkIGRhdGEKYGBge3IgZGF0YX0KIyBDb3VudHMKbG9hZCgiZGF0YS9wcy5SRGF0YSIpCgojIFRheG9ub215CmxvYWQoImRhdGEvdGF4YS5wbHVzLlJEYXRhIikKdGF4YSA8LSBkYXRhLnRhYmxlKHNlcTE2cyA9IHJvd25hbWVzKHRheGEucGx1cyksCiAgICAgICAgICAgICAgICAgICB0YXhhLnBsdXMpCgojIFNhbXBsZXMKIyBwc0BzYW1fZGF0YQpsb2FkKCJkYXRhL3NhbXBsZXMuUkRhdGEiKQpzYW1wbGVzJFNhbXBsZSA8LSBzdWJzdHIoeCA9IHNhbXBsZXMkTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSA1KQpzYW1wbGVzJFNhbXBsZVtzYW1wbGVzJFNhbXBsZSAlaW4lIGMoIjRBX1MxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0Ql9TMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNENfUzMiKV0gPC0gCiAgc3Vic3RyKHggPSBzYW1wbGVzJFNhbXBsZVtzYW1wbGVzJFNhbXBsZSAlaW4lIGMoIjRBX1MxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNEJfUzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0Q19TMyIpXSwKICAgICAgICAgc3RhcnQgPSAxLAogICAgICAgICBzdG9wID0gMikKRFQ6OmRhdGF0YWJsZShzYW1wbGVzKQpgYGAKCiMjIyBUYXhvbm9teSBSYW5rczoKIyMjIyAqKksqKmluZyAqKlAqKmhpbGxpcCAqKkMqKmFuIG4qKk8qKnQgKipGKippbmQgKipHKipyZWVuICoqUyoqb2NrcwoqIEtpbmdkb20gICAgICAgICAgICAgICAgCiogUGh5bHVtICAgICAgICAgICAgICAgICAgICAKKiBDbGFzcyAgICAgICAgICAgICAgICAgICAKKiBPcmRlciAgICAgICAgICAgICAgICAgICAKKiBGYW1pbHkgICAgIAoqIEdlbnVzICAgICAKKiBTcGVjaWVzICAKCiMjIyBSaWNobmVzcwpgYGB7ciBSaWNobmVzcywgZmlnLndpZHRoID0gMTAsZmlnLmhlaWdodCA9IDV9CiMgUGFydCBJOiBrZWVwIGNvbnRyb2xzIGFuZCBQRUlUQ3MgYXQgd2Vla3MgNSBhbmQgOSBvbmx5Cnc1OSA8LSBwcnVuZV9zYW1wbGVzKHNhbXBsZXMgPSBzYW1wbGVfbmFtZXMocHMpWyEoc2FtcGxlX25hbWVzKHBzKSAlaW4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCI0QSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0QiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0QyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmRldGVybWluZWQiKSldLAogICAgICAgICAgICAgICAgICAgIHggPSBwcykKIyB3NTkgPC0gcHJ1bmVfc2FtcGxlcyhzYW1wbGVzID0gc2FtcGxlX25hbWVzKHBzKVtzYW1wbGVfbmFtZXMocHMpICE9ICJVbmRldGVybWluZWQiXSwgCiMgICAgICAgICAgICAgICAgICAgICB4ID0gcHMpCgojIHAxIDwtIHBsb3RfcmljaG5lc3ModzU5LAojICAgICAgICAgICAgICAgeCA9ICJEaWV0X1dlZWsiLCAKIyAgICAgICAgICAgICAgIG1lYXN1cmVzID0gIlNoYW5ub24iLAojICAgICAgICAgICAgICAgY29sb3IgPSAiV2VlayIpICsKIyAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBJRCksCiMgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiMgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsCiMgICAgICAgICAgICAgIHNpemUgPSAzLAojICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpCgpwMSA8LSBwbG90X3JpY2huZXNzKHc1OSwKICAgICAgICAgICAgICAgICAgICB4ID0gIkRpZXRfV2VlayIsIAogICAgICAgICAgICAgICAgICAgIG1lYXN1cmVzID0gIlNoYW5ub24iKSArCiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gSUQpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gSUQpLAogICAgICAgICAgICAgc2hhcGUgPSAyMSwKICAgICAgICAgICAgIHNpemUgPSAzLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgiIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKZ2dwbG90bHkocDEpCgp0aWZmKGZpbGVuYW1lID0gInRtcC9rb19zaGFubm9uLnRpZmYiLAogICAgIGhlaWdodCA9IDQsCiAgICAgd2lkdGggPSA1LAogICAgIHVuaXRzID0gImluIiwKICAgICByZXMgPSA2MDAsCiAgICAgY29tcHJlc3Npb24gPSAibHp3K3AiKQpwcmludChwMSkKZ3JhcGhpY3Mub2ZmKCkKYGBgCgojIE9UVSB0YWJsZSAoZmlyc3QgMTAgcm93cykKYGBge3Igb3R1X3RhYmxlLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRX0Kb3R1IDwtIGRhdGEudGFibGUodzU5QHRheF90YWJsZUAuRGF0YSwKICAgICAgICAgICAgICAgICAgdCh3NTlAb3R1X3RhYmxlQC5EYXRhKSkKZGF0YXRhYmxlKGhlYWQob3R1LCAxMCksCiAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLAogICAgICAgICAgY2FwdGlvbiA9ICJUYXhvbm9taWMgIGNvdW50IHRhYmxlIiwKICAgICAgICAgIGNsYXNzID0gImNlbGwtYm9yZGVyIHN0cmlwZSIsCiAgICAgICAgICBvcHRpb25zID0gbGlzdChzZWFyY2ggPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSAxMCkpICU+JQogIGZvcm1hdEN1cnJlbmN5KGNvbHVtbnMgPSA3Om5yb3cob3R1KSwKICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLAogICAgICAgICAgICAgICAgIG1hcmsgPSAiLCIsCiAgICAgICAgICAgICAgICAgZGlnaXRzID0gMCkKYGBgCgojIFRvdGFsIGNvdW50cyBwZXIgc2FtcGxlIChpLmUuIHNlcXVlbmNpbmcgZGVwdGgpCmBgYHtyIFRheCwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NX0KdDEgPC0gY29sU3VtcyhvdHVbLCA4Om5jb2wob3R1KV0pCnQxIDwtIGRhdGEudGFibGUoU0FNUExFX05BTUUgPSBuYW1lcyh0MSksCiAgICAgICAgICAgICAgICAgVG90YWwgPSB0MSkKCnRtcCA8LSBkYXRhLnRhYmxlKFNBTVBMRV9OQU1FID0gc2FtcGxlcyRTYW1wbGUsCiAgICAgICAgICAgICAgICAgIFRSRUFUTUVOVCA9IHNhbXBsZXMkRGlldCwKICAgICAgICAgICAgICAgICAgV0VFSyA9IHNhbXBsZXMkV2VlaykKCnQxIDwtIG1lcmdlKHRtcCwKICAgICAgICAgICAgdDEsCiAgICAgICAgICAgIGJ5ID0gIlNBTVBMRV9OQU1FIikKCnAxIDwtIGdncGxvdCh0MSwKICAgICAgICAgICAgIGFlcyh4ID0gU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgeSA9IFRvdGFsLAogICAgICAgICAgICAgICAgIGZpbGwgPSBUUkVBVE1FTlQsCiAgICAgICAgICAgICAgICAgY29sb3VyID0gV0VFSykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHNjYWxlX3hfZGlzY3JldGUoIlNhbXBsZSBOYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cygiTnVtYmVyIG9mIFJlYWRzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUoIkdyb3VwIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxKSkgCmdncGxvdGx5KHAxKQpgYGAKCgojIENvdW50cyBhdCBQaHlsdW0gbGV2ZWwKYGBge3IgY291bnRzX3AsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQpjb3VudHNfcCA8LSBjb3VudHNfYnlfdGF4X3JhbmsoZHQxID0gb3R1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncl9ieSA9ICJQaHlsdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzX3N0YXJ0ID0gOCkKc2V0b3JkZXIoY291bnRzX3AsIC1gNUExLUNgKQpkYXRhdGFibGUoY291bnRzX3AsCiAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLAogICAgICAgICAgY2FwdGlvbiA9ICJUYXhvbm9taWMgIGNvdW50IHRhYmxlIiwKICAgICAgICAgIGNsYXNzID0gImNlbGwtYm9yZGVyIHN0cmlwZSIsCiAgICAgICAgICBvcHRpb25zID0gbGlzdChzZWFyY2ggPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSBucm93KGNvdW50c19wKSkpICU+JQogIGZvcm1hdEN1cnJlbmN5KGNvbHVtbnMgPSAyOm5jb2woY291bnRzX3ApLAogICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gIiIsCiAgICAgICAgICAgICAgICAgbWFyayA9ICIsIiwKICAgICAgICAgICAgICAgICBkaWdpdHMgPSAwKQpgYGAKCiMgUmVsYXRpdmUgYWJ1bmRhbmNlICglKSBhdCBQaHlsdW0gbGV2ZWwKYGBge3IgcmFfcCwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CnJhX3AgPC0gcmFfYnlfdGF4X3JhbmsoY291bnRzID0gY291bnRzX3AsCiAgICAgICAgICAgICAgICAgICAgICAgcGN0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgZGlnaXQgPSA0KQoKZGF0YXRhYmxlKHJhX3AsCiAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLAogICAgICAgICAgY2FwdGlvbiA9ICJUYXhvbm9taWMgIGNvdW50IHRhYmxlIiwKICAgICAgICAgIGNsYXNzID0gImNlbGwtYm9yZGVyIHN0cmlwZSIsCiAgICAgICAgICBvcHRpb25zID0gbGlzdChzZWFyY2ggPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSBucm93KHJhX3ApKSkgJT4lCiAgZm9ybWF0UGVyY2VudGFnZShjb2x1bW5zID0gMjpuY29sKGNvdW50c19wKSwKICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIpCmBgYAoKUmVtb3ZlIHBoeWxhIHdpdGggcmVsYXRpdmUgYWJ1bmRhbmNlIG9mID49IDElIGluIGxlc3MgdGhhbiAxMCUgb2Ygc2FtcGxlcy4gIAogIApgYGB7ciBwcmV2X3B9CnQxIDwtIGRhdGEudGFibGUoUGh5bHVtID0gcmFfcCRQaHlsdW0sCiAgICAgICAgICAgICAgICAgYE51bWJlciBvZiBTYW1wbGVzYCA9IHJvd1N1bXMocmFfcFssIDI6bmNvbChyYV9wKV0gPj0gMC4wMSkpCnQxJGBQZXJjZW50IFNhbXBsZXNgIDwtICB0MSRgTnVtYmVyIG9mIFNhbXBsZXNgLzMwCgpzZXRvcmRlcih0MSwgLWBOdW1iZXIgb2YgU2FtcGxlc2ApCmRhdGF0YWJsZSh0MSwKICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICAgICAgICBjYXB0aW9uID0gIlRheG9ub21pYyAgY291bnQgdGFibGUiLAogICAgICAgICAgY2xhc3MgPSAiY2VsbC1ib3JkZXIgc3RyaXBlIiwKICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHNlYXJjaCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IG5yb3codDEpKSkgJT4lCiAgZm9ybWF0UGVyY2VudGFnZShjb2x1bW5zID0gMywKICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDEpCmBgYAoKYGBge3Iga2VlcF82X3BoeWxhLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRX0Ka2VlcF9wIDwtIHQxJFBoeWx1bVt0MSRgUGVyY2VudCBTYW1wbGVzYCA+PSAwLjFdCnBhc3RlMChrZWVwX3AsIGNvbGxhcHNlID0gIiwgIikKCnBzMSA8LSBzdWJzZXRfdGF4YSh3NTksIAogICAgICAgICAgICAgICAgICAgUGh5bHVtICVpbiUga2VlcF9wICkKb3R1MSA8LSBkYXRhLnRhYmxlKHBzMUB0YXhfdGFibGVALkRhdGEsCiAgICAgICAgICAgICAgICAgICB0KHBzMUBvdHVfdGFibGVALkRhdGEpKQoKZGF0YXRhYmxlKGhlYWQob3R1MSwgMTApLAogICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgIGNhcHRpb24gPSAiVGF4b25vbWljICBjb3VudCB0YWJsZSIsCiAgICAgICAgICBjbGFzcyA9ICJjZWxsLWJvcmRlciBzdHJpcGUiLAogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2VhcmNoID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTApKSAlPiUKICBmb3JtYXRDdXJyZW5jeShjb2x1bW5zID0gNzpuY29sKG90dTEpLAogICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gIiIsCiAgICAgICAgICAgICAgICAgbWFyayA9ICIsIiwKICAgICAgICAgICAgICAgICBkaWdpdHMgPSAwKQpgYGAKCiMgUmVsYXRpdmUgQWJ1bmRhbmNlIGluIFNhbXBsZXMgYXQgRGlmZmVyZW50IFRheG9ub21pYyBSYW5rcwojIyAxLiBDbGFzcwpgYGB7ciBjb3VudHNfYywgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9Nn0KY291bnRzX2MgPC0gY291bnRzX2J5X3RheF9yYW5rKGR0MSA9IG90dTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyX2J5ID0gIkNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c19zdGFydCA9IDgpCnJhX2MgPC0gcmFfYnlfdGF4X3JhbmsoY291bnRzX2MpCgp0YXgucmFua3MgPC0gdW5pcXVlKG90dTFbLCBjKCJQaHlsdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzcyIpXSkKCnJhX2MgPC0gbWVyZ2UodGF4LnJhbmtzLAogICAgICAgICAgICAgIHJhX2MsCiAgICAgICAgICAgICAgYnkgPSAiQ2xhc3MiKQoKdG90YWwgPC0gcm93U3VtcyhyYV9jWywgMzpuY29sKHJhX2MpXSkKCnJhX2MkQ2xhc3MgPC0gZmFjdG9yKHJhX2MkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHJhX2MkQ2xhc3Nbb3JkZXIodG90YWwpXSkKCnJhX2MkUGh5bHVtIDwtIGZhY3RvcihyYV9jJFBoeWx1bSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHVuaXF1ZShyYV9jJFBoeWx1bVtvcmRlcih0b3RhbCldKSkKdG1wIDwtIG1lbHQuZGF0YS50YWJsZShkYXRhID0gcmFfYywKICAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gMToyLAogICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUudmFycyA9IDM6bmNvbChjb3VudHNfYyksCiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJTQU1QTEVfTkFNRSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJSQSIpCgp0bXAgPC0gbWVyZ2UoZGF0YS50YWJsZShTQU1QTEVfTkFNRSA9IHNhbXBsZXMkU2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICBXRUVLID0gc2FtcGxlcyRXZWVrLAogICAgICAgICAgICAgICAgICAgICAgICBUUkVBVE1FTlQgPSBzYW1wbGVzJERpZXQpLAogICAgICAgICAgICAgdG1wLAogICAgICAgICAgICAgYnkgPSAiU0FNUExFX05BTUUiKQoKIyBQbG90IHNhbXBsZXMKcDEgPC0gZ2dwbG90KHRtcCwKICAgICAgICAgICAgIGFlcyh4ID0gU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgeSA9IFJBLAogICAgICAgICAgICAgICAgIGZpbGwgPSBDbGFzcywKICAgICAgICAgICAgICAgICBjb2xvciA9IFBoeWx1bSkpICsKICBmYWNldF93cmFwKH4gV0VFSyArIFRSRUFUTUVOVCwKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giLAogICAgICAgICAgICAgbnJvdyA9IDMpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHNjYWxlX3hfZGlzY3JldGUoIiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEpKQpnZ3Bsb3RseShwMSkKYGBgCgpgYGB7ciBtZWFuc19jLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpscmEgPC0gbWVsdC5kYXRhLnRhYmxlKGRhdGEgPSByYV9jLAogICAgICAgICAgICAgICAgICAgICAgIGlkLnZhcnMgPSAxOjIsCiAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gMzpuY29sKHJhX2MpLAogICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiU2FtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlJBIikKCgpscmEkU2FtcGxlIDwtIGFzLmNoYXJhY3RlcihscmEkU2FtcGxlKQoKIyBNZXJnZSBjb3VudHMgYW5kIHJlbGF0aXZlIGFidW5kYW5jZSBpbmZvLS0tLQpscmEgPC0gbWVyZ2UobHJhLAogICAgICAgICAgICAgc2FtcGxlcywKICAgICAgICAgICAgIGJ5ID0gIlNhbXBsZSIpCgptdSA8LSBkYXRhLnRhYmxlKGFnZ3JlZ2F0ZShscmEkUkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbGlzdChXZWVrID0gbHJhJFdlZWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVhdG1lbnQgPSBscmEkRGlldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzID0gbHJhJENsYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gIm1lYW4iKSkKbXVbLCB0b3RhbCA6PSBzdW0oeCksCiAgIGJ5ID0gIkNsYXNzIl0KdWwgPC0gdW5pcXVlKG11WywgYygiQ2xhc3MiLCAKICAgICAgICAgICAgICAgICAgICAidG90YWwiKV0pCnVsIDwtIHVsW29yZGVyKHRvdGFsKSxdCm11JENsYXNzIDwtIGZhY3RvcihtdSRDbGFzcywKICAgICAgICAgICAgICAgICAgIGxldmVsID0gdWwkQ2xhc3MpCm11JHRvdGFsIDwtIE5VTEwKCmRhdGF0YWJsZShtdSwKICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICAgICAgICBjYXB0aW9uID0gIlRheG9ub21pYyAgY291bnQgdGFibGUiLAogICAgICAgICAgY2xhc3MgPSAiY2VsbC1ib3JkZXIgc3RyaXBlIiwKICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHNlYXJjaCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IG5yb3cobXUpLAogICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIgPSBsaXN0KGxpc3QoMywgJ2Rlc2MnKSkpKSAlPiUKICBmb3JtYXRDdXJyZW5jeShjb2x1bW5zID0gNCwKICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLAogICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIpCmBgYAoKYGBge3IgbWVhbnNfY19wMCwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDV9CnAwIDwtIGdncGxvdChtdSwKICAgICAgICAgICAgIGFlcyh4ID0gV2VlaywKICAgICAgICAgICAgICAgICB5ID0geCwKICAgICAgICAgICAgICAgICBncm91cCA9IFRyZWF0bWVudCkpICsKICBmYWNldF93cmFwKH4gQ2xhc3MsCiAgICAgICAgICAgICBzY2FsZSA9ICJmcmVlX3kiKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50LAogICAgICAgICAgICAgICAgIGNvbG9yID0gVHJlYXRtZW50KSwKICAgICAgICAgICAgIHNpemUgPSAzLAogICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsKICBzY2FsZV94X2Rpc2NyZXRlKCIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJSZWxhdGl2ZSBBYnVuZGFuY2UgKCUpIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxKSkKCnRpZmYoZmlsZW5hbWUgPSAidG1wL2tvX2NsYXNzX292ZXJfdGltZS50aWZmIiwKICAgICBoZWlnaHQgPSA1LAogICAgIHdpZHRoID0gNywKICAgICB1bml0cyA9ICJpbiIsCiAgICAgcmVzID0gNjAwLAogICAgIGNvbXByZXNzaW9uID0gImx6dytwIikKcHJpbnQocDApCmdyYXBoaWNzLm9mZigpCgpwcmludChwMCkKYGBgCgpgYGB7ciBtZWFuc19jX3AxLCBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gNn0KcDEgPC0gZ2dwbG90KG11LAogICAgICAgICAgICAgYWVzKHggPSB4LAogICAgICAgICAgICAgICAgIHkgPSBDbGFzcywKICAgICAgICAgICAgICAgICBjb2xvciA9IFRyZWF0bWVudCwKICAgICAgICAgICAgICAgICBzaGFwZSA9IFdlZWspKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywKICAgICAgICAgICAgIGFscGhhID0gMC41KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIlJlbGF0aXZlIEFidW5kYW5jZSAoJSkiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgp0aWZmKGZpbGVuYW1lID0gInRtcC9rb19jbGFzc19yYS50aWZmIiwKICAgICBoZWlnaHQgPSA0LAogICAgIHdpZHRoID0gNywKICAgICB1bml0cyA9ICJpbiIsCiAgICAgcmVzID0gNjAwLAogICAgIGNvbXByZXNzaW9uID0gImx6dytwIikKcHJpbnQocDEpCmdyYXBoaWNzLm9mZigpCgpnZ3Bsb3RseShwMSkKYGBgCg==